﻿Imports WSEntidades
Imports Utilerias
Imports WSDatos
Public Class AlumnosBL
    Public Function RegistrarAlumno(ByVal TokenConexion As String, ByVal Alumno As AlumnosBE, ByRef detResp As DetalleRespuesta) As Boolean
        Dim alumDAL As AlumnosDAL = New AlumnosDAL("")
        detResp.Mensajes = ""
        Try
            TokenConexion = RijndaelSimple.desencriptaDefault(TokenConexion)
            If (EsValidoPara(Enumeraciones.operacionesCatalogos.Registrar, Alumno, detResp.Mensajes)) Then
                alumDAL = New AlumnosDAL(TokenConexion)
                If (alumDAL.existeAlumnoCurp(Alumno.Curp)) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_PreviamenteRegistrado,
                                             "Existe un registro con el mismo CURP del alumno indicado." & vbCrLf & detResp.Mensajes)
                    Return False
                Else
                    If (alumDAL.registraAlumno(Alumno)) Then
                        detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "El Alumno se registro con éxito.")
                        Return True
                    Else
                        detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueRegistrado,
                                                 "El Alumno no pudo ser registrado en el sistema." & vbCrLf & detResp.Mensajes)
                        Return False
                    End If
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "El alumno no es valido para registrar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "AlumnosBL.RegistrarAlumno")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                        detResp.Mensajes & "Excepción al registrar el Alumno: " & ex.Message)
            Return False
        Finally
            alumDAL = Nothing
        End Try
    End Function

    Private Function EsValidoPara(ByVal tipoOperacion As Enumeraciones.operacionesCatalogos, ByRef Alumno As AlumnosBE, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try
            If (tipoOperacion = Enumeraciones.operacionesCatalogos.Actualizar) Then
                If (String.IsNullOrEmpty(Alumno.IdAlumno)) Then
                    mensaje &= "El ID del Alumno es requerido." & vbCrLf
                Else
                    If (Alumno.IdAlumno < 1) Then
                        mensaje &= "El ID del Alumno debe ser mayor a 0, y debe estar previamente registrado en el sistema." & vbCrLf
                    End If
                End If
            End If

            If (String.IsNullOrWhiteSpace(Alumno.Nombre)) Then
                mensaje &= "El nombre del Alumno es obligatorio, no puede ir el campo vacio." & vbCrLf
            Else
                Alumno.Nombre = Alumno.Nombre.Trim
                If (Alumno.Nombre.Length > 255) Then
                    Alumno.Nombre = Alumno.Nombre.Substring(0, 255)
                End If
            End If

            If (String.IsNullOrWhiteSpace(Alumno.Curp)) Then
                mensaje &= "El Curp del alumno es obligatorio, no puede ir el campo vacio." & vbCrLf
            Else
                Alumno.Curp = Alumno.Curp.Trim.ToUpper

                Select Case Alumno.Curp.Length
                    Case 18
                        If (Not (csValidaciones.esCurpValido(Alumno.Curp))) Then
                            mensaje &= String.Format("CURP <{0}> no válido para el Alumno", Alumno.Curp) & vbCrLf
                        End If
                    Case Else
                        mensaje &= String.Format("Longitud de CURP no válida (<{0}>)", Alumno.Curp) & vbCrLf
                End Select
            End If

            If (Alumno.Nivel = AlumnosBE.EstatusNivel.Todos) Then
                mensaje &= "Especificar el Nivel Educativo del Alumno, el nivel 'Todos' se utiliza únicamente para búsquedas." & vbCrLf
            End If

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "AlumnosBL.EsValidoParaRegistrar")
            mensaje &= ex.Message
            Return False
        End Try
    End Function

    Public Function ActualizaAlumno(ByVal TokenConexion As String, ByVal Alumno As AlumnosBE, ByRef detResp As DetalleRespuesta) As Boolean
        detResp.Mensajes = ""
        Dim alumDAL As AlumnosDAL = New AlumnosDAL("")
        Try
            TokenConexion = RijndaelSimple.desencriptaDefault(TokenConexion)
            If (EsValidoPara(Enumeraciones.operacionesCatalogos.Actualizar, Alumno, detResp.Mensajes)) Then
                alumDAL = New AlumnosDAL(TokenConexion)
                If (alumDAL.actualizaAlumno(Alumno, detResp.Mensajes)) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK,
                                             "Datos del Alumno actualizados.")
                    Return True
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueActualizado,
                                             "No se pudo realizar la actualización de Datos del Alumno." & vbCrLf &
                                             "Verifique que el Id del Alumno esté registrado en el sistema." & vbCrLf & detResp.Mensajes)
                    Return False
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "La informacion no es valida para actualizar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "AlumnosBL.ActualizaAlumno")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                        detResp.Mensajes & "Excepción al actualizar Alumno: " & ex.Message)
            Return False
        Finally
            alumDAL = Nothing
        End Try
    End Function

    Public Function CambiaEstatus(ByVal tokenConexion As String, ByVal Id As Integer, ByVal setActivo As Boolean,
                                           ByRef detResp As DetalleRespuesta) As Boolean
        detResp.Mensajes = ""
        Dim alumDAL As AlumnosDAL = New AlumnosDAL("")
        Try
            If (EsValidoParaGetAlumnoById(Id, detResp.Mensajes)) Then
                alumDAL = New AlumnosDAL(RijndaelSimple.desencriptaDefault(tokenConexion))
                If (alumDAL.cambiaStatus(Id, setActivo)) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK,
                                             "Estatus del Alumno Actualizado.")
                    Return True
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueActualizado,
                                             "No se pudo realizar la actualización de estatus del Alumno." & vbCrLf &
                                             "Verifique que el Id del Alumno esté registrado en el sistema." & vbCrLf & detResp.Mensajes)
                    Return False
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "La informacion no es valida para actualizar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "AlumnosBL.CambiaEstatus")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al actualizar estatus del Alumno: " & ex.Message)
            Return False
        Finally
            alumDAL = Nothing
        End Try
    End Function

    Public Function GetAlumnoById(ByVal tokenConexion As String, ByVal IdAlumno As Integer, ByRef detResp As DetalleRespuesta) As AlumnosBE
        detResp.Mensajes = ""
        Dim alumDAL As AlumnosDAL = New AlumnosDAL("")
        Dim alumBE As AlumnosBE
        Try
            tokenConexion = RijndaelSimple.desencriptaDefault(tokenConexion)
            If (EsValidoParaGetAlumnoById(IdAlumno, detResp.Mensajes)) Then
                alumDAL = New AlumnosDAL(tokenConexion)
                alumBE = alumDAL.getAlumnoById(IdAlumno)
                If (alumBE IsNot Nothing) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "Se obtuvo la información del Alumno con éxito.")
                    Return alumBE
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_RegistroInexistenteOInactivo,
                                             "No se obtuvo la información del Alumno" & vbCrLf & detResp.Mensajes)
                    Return Nothing
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "El Id del alumno proporcionado no existe: " & vbCrLf & detResp.Mensajes)
                Return Nothing
            End If
        Catch ex As Exception
            Log.LogException(ex, "AlumnosBL.GetAlumnoById")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                        detResp.Mensajes & "Excepción al obtener información del Alumno: " & ex.Message)
            Return Nothing
        Finally
            alumDAL = Nothing
            alumBE = Nothing
        End Try
    End Function

    Private Function EsValidoParaGetAlumnoById(ByRef IdAlumno As Integer, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try
            If (String.IsNullOrEmpty(IdAlumno)) Then
                mensaje &= "El campo ID del Alumno no puede ir vacio." & vbCrLf
            Else
                If (IdAlumno <= 0) Then
                    mensaje &= "El Id del Alumno debe ser mayor a 0" & vbCrLf
                End If
            End If

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "AlumnosBL.EsValidoParaGetAlumnoById")
            mensaje &= ex.Message
            Return False
        End Try
    End Function

    Public Function GetAlumnoByCurp(ByVal tokenConexion As String, ByVal Curp As String, ByRef detResp As DetalleRespuesta) As AlumnosBE
        detResp.Mensajes = ""
        Dim alumDAL As AlumnosDAL = New AlumnosDAL("")
        Dim alumBE As AlumnosBE
        Try
            tokenConexion = RijndaelSimple.desencriptaDefault(tokenConexion)
            If (EsValidoParaGetAlumnoByCurp(Curp, detResp.Mensajes)) Then
                alumDAL = New AlumnosDAL(tokenConexion)
                If (alumDAL.existeAlumnoCurp(Curp)) Then
                    alumBE = alumDAL.getAlumnoByCurp(Curp)
                    If (alumBE IsNot Nothing) Then
                        detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "Se obtuvo la información del alumno con éxito.")
                        Return alumBE
                    Else
                        detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_RegistroInexistenteOInactivo,
                                                 "No se obtuvo la información del Alumno" & vbCrLf & detResp.Mensajes)
                        Return Nothing
                    End If
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_RegistroInexistenteOInactivo,
                                             "Alumno no existe" & vbCrLf & detResp.Mensajes)
                    Return Nothing
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "La CURP del alumno proporcionado no existe: " & vbCrLf & detResp.Mensajes)
                Return Nothing
            End If
        Catch ex As Exception
            Log.LogException(ex, "AlumnosBL.GetAlumnoByCurp")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                        detResp.Mensajes & "Excepción al obtener información del Alumno: " & ex.Message)
            Return Nothing
        Finally
            alumDAL = Nothing
            alumBE = Nothing
        End Try
    End Function

    Private Function EsValidoParaGetAlumnoByCurp(ByRef Curp As String, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try
            If (String.IsNullOrWhiteSpace(Curp)) Then
                mensaje &= "La CURP del alumno es obligatorio, no puede ir el campo vacio." & vbCrLf
            Else
                Curp = Curp.Trim.ToUpper

                Select Case Curp.Length
                    Case 18
                        If (Not (csValidaciones.esCurpValido(Curp))) Then
                            mensaje &= String.Format("CURP <{0}> no válido para el Alumno", Curp) & vbCrLf
                        End If
                    Case Else
                        mensaje &= String.Format("Longitud de CURP no válida (<{0}>)", Curp) & vbCrLf
                End Select
            End If

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "AlumnosBL.EsValidoParaGetAlumnoByCurp")
            mensaje &= ex.Message
            Return False
        End Try
    End Function

    Public Function GetListadoAlumnos(ByVal tokenConexion As String, ByVal Nombre As String,
                                       ByVal Curp As String, ByVal Nivel As AlumnosBE.EstatusNivel, ByVal estatus As Enumeraciones.estatusParaBusquedas,
                                       ByVal pRegistroInicial As Integer, ByVal pPageSize As Integer,
                                       ByVal pSortColumn As Enumeraciones.campoOrdenamiento, ByVal pSortDirection As Enumeraciones.tipoOrdenamiento,
                                       ByRef pTotalRegistros As Integer,
                                       ByRef detResp As DetalleRespuesta) As List(Of AlumnosBE)
        detResp.Mensajes = ""
        pTotalRegistros = 0
        Dim alumDAL As AlumnosDAL = New AlumnosDAL("")
        Dim listalumBE As List(Of AlumnosBE)
        Try
            tokenConexion = RijndaelSimple.desencriptaDefault(tokenConexion)
            alumDAL = New AlumnosDAL(tokenConexion)
            listalumBE = alumDAL.getlistadoAlumnos(Nombre, Curp, Nivel, estatus, pRegistroInicial, pPageSize, pSortColumn, pSortDirection, pTotalRegistros)
            If (listalumBE IsNot Nothing) Then
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "Se obtuvo el listado de los Alumnos con éxito.")
                Return listalumBE
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoObtuvoRegistrosParaListado,
                                         "No se obtuvo el listado de Alumnos" & vbCrLf & detResp.Mensajes)
                Return Nothing
            End If
        Catch ex As Exception
            Log.LogException(ex, "AlumnosBL.GetListadoAlumnos")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                        detResp.Mensajes & "Excepción al obtener el listado de Alumnos: " & ex.Message)
            Return Nothing
        Finally
            alumDAL = Nothing
            listalumBE = Nothing
        End Try
    End Function
End Class
